//1.函数定义类型和返回值|箭头函数定义类型和返回值
//2.函数默认的参数|函数可选参数
//3.参数是一个对象如何定义
//4.函数this类型
//5.函数重载

function add(a:number, b:number):number {
  return a + b;
}
console.log(add(1, 2));

const add2 = (a:number, b:number):number => (a + b)
console.log(add2(3, 4));

const add3 = (a: number = 10, b: number =20): number => (a + b)
console.log(add3(1));

// const add4 = (a: number = 10, b?: number) => (a + b)
// console.log(add4(1));

interface User {
  name: string
  age: number
}

function getUser(user: User): User {
  return user
}

const user = getUser({name: "小孙", age: 18})
console.log(user);

interface Obj {
  user: number[]
  add: (this:Obj, num:number) => void
}

// ts  可以定义this的类型  在js中无法使用  必须是第一个参数定义this的类型
let obj:Obj = {
  user: [1, 2, 3],
  add(this:Obj, num:number) {
    this.user.push(num)
  }
}

obj.add(4)
console.log(obj);

let userObj:number[] = [1, 2, 3]
function findNum(add:number[]):number[] //  如果传的是一个number类型的数组那就做添加  数组类型
function findNum(id:number):number[] // 如果传入了id就是单个查询  数值型
function findNum():number[] // 如果没有传入东西就是查询全部
function findNum(ids?:number | number[]):number[]{
  if(typeof ids == 'number') {
    return userObj.filter(item => item == ids)
  } else if(Array.isArray(ids)) {
    userObj.push(...ids)
    return userObj
  } else {
    return userObj
  }
}

console.log(findNum())
console.log(findNum(1))
console.log(findNum([4,5,6]))
console.log(findNum([1,2,3]))
